﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SistemaControleOrcamentario
{
    public partial class Lancamento : Form
    {
        public bool FormEntrada { get; set; }
        public Lancamento(bool entrada)
        {
            InitializeComponent();
            CarregarGrid();

            lblDescricaoGrid.Text = "Lançamentos do mês de " + System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.Now.Month);

            FormEntrada = entrada;

            if (FormEntrada)
            {
                dtpDataPagamento.Enabled = false;
            }

            CarregarComboBox();

        }

        private void CarregarComboBox()
        {
            InternalLoad();

            if (((IList<DataLayer.Model.Categoria>)cbCategoria.DataSource).Count == 0)
            {
                MessageBox.Show("Não existem categorias cadastradas. Favor cadastrar inicialmente!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
                (new SistemaControleOrcamentario.Categoria()).ShowDialog();
            }

            if (((IList<DataLayer.Model.Conta>)cbContaDebitoCredito.DataSource).Count == 0)
            {
                MessageBox.Show("Não existem contas cadastradas. Favor cadastrar inicialmente!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Error);
                (new SistemaControleOrcamentario.Conta()).ShowDialog();
            }

            InternalLoad();
            cbCategoria.DisplayMember = "DescricaoCompleta";
            cbCategoria.ValueMember = "ID";
        }

        private void InternalLoad()
        {
            if (FormEntrada)
                cbCategoria.DataSource = DataLayer.Model.Categoria.GetAll().Where(p => p.TipoLancamento == DataLayer.Model.Categoria.eTipoLancamento.Entrada).OrderBy(p => p.DescricaoCompleta).ToList();
            else
                cbCategoria.DataSource = DataLayer.Model.Categoria.GetAll().Where(p => p.TipoLancamento == DataLayer.Model.Categoria.eTipoLancamento.Saida).OrderBy(p => p.DescricaoCompleta).ToList();

            cbContaDebitoCredito.DataSource = DataLayer.Model.Conta.GetAll().OrderBy(p => p.Descricao).ToList();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (cbCategoria.SelectedItem == null)
            {
                MessageBox.Show("É necessário selecionar uma categoria!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            if (cbContaDebitoCredito.SelectedItem == null)
            {
                MessageBox.Show("É necessário selecionar uma Conta!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            decimal _valor;
            if (!decimal.TryParse(txtValor.Text, out _valor))
            {
                MessageBox.Show("Valor inválido!", "Atenção", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                return;
            }

            DataLayer.Model.Lancamento _lanc = new DataLayer.Model.Lancamento();
            _lanc.DataVencimento = DateTime.Parse(dtpDataVencimento.Text);

            if (!FormEntrada)
                _lanc.DataPagamento = DateTime.Parse(dtpDataPagamento.Text);
            else
                _lanc.DataPagamento = _lanc.DataVencimento;

            _lanc.Descricao = txtDescricao.Text;
            _lanc.Valor = _valor;

            if (_lanc.Valor < 0)
                _lanc.Valor *= -1;

            _lanc.Categoria = (DataLayer.Model.Categoria)cbCategoria.SelectedItem;
            _lanc.Conta = (DataLayer.Model.Conta)cbContaDebitoCredito.SelectedItem;

            if (_lanc.Categoria.TipoLancamento == DataLayer.Model.Categoria.eTipoLancamento.Saida)
                _lanc.Valor *= -1;

            _lanc.Salvar();

            CarregarGrid();

            txtDescricao.Text = "";
            txtValor.Text = "";

        }

        private void CarregarGrid()
        {
            List<DataLayer.Model.Lancamento> list = DataLayer.Model.Lancamento.GetAll();

            decimal mesAnterior = (from p in list
                                   where p.DataPagamento.Month < DateTime.Now.Month
                                   select p).Sum(p => p.Valor);

            txtTotalAnterior.Text = mesAnterior.ToString("c");

            list = (from p in list
                    where p.DataPagamento.Month == DateTime.Now.Month
                    select p).ToList();

            decimal total = list.Sum(p => p.Valor) + mesAnterior;

            txtTotal.Text = total.ToString("c");
            dataGridView1.DataSource = list;
        }

        private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
        {
            string a = "";
        }

        private void Lancamento_Load(object sender, EventArgs e)
        {

        }
    }
}
